package com.tjn.customGeneric;

/**
 * @author 陶镓妮
 * @version 1.0
 */
public class CustomGeneric {
    public static void main(String[] args) {
        //T=Double, R=String, M=Integer
        Cat<Integer,String,Double> g = new Cat<>("john");
        g.setAge(10); //OK
        //g.setT("yy"); //错误，类型不对
        System.out.println(g);
        Cat g2 = new Cat("john~~");//OK T=Object R=Object M=Object
        g2.setAge("yy"); //OK ,因为 T=Object "yy"=String 是 Object 子类
        System.out.println("g2=" + g2);
    }
}
class Cat<T,R,M>{
    String name;
    T age;//属性使用泛型
    R sex;
    M color;

    //T[] arr = new T[10];使用泛型的数组不能初始化，因为类型还没有确定

    //静态方法和属性不能使用泛型，因为静态成员在类加载的时候就会被加载，这时还没有确定泛型的类型
    //static E size;
    //public static E getSize(){return null;}

    public Cat(String name) {
        this.name = name;
    }

    public Cat(String name, T age, R sex, M color) {//构造器使用泛型
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.color = color;
    }

    public T getAge() {//返回类型使用泛型
        return age;
    }

    public void setAge(T age) {//方法使用泛型
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public R getSex() {
        return sex;
    }

    public void setSex(R sex) {
        this.sex = sex;
    }

    public M getColor() {
        return color;
    }

    public void setColor(M color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", color=" + color +
                '}';
    }
}